package collection.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;

/**
 * JDK1.8之后, 集合提供了流式操作, 以流的处理思路完成对集合元素的操作
 * 集合提供了一个方法: stream(), 可以将集合变为一个"流", 流中的内容就是集合中的每个元素
 * 我们可以在流中添加各种渐渐环节(相当于IO中的高级流), 每个中间环节都会将元素经过时进行相应的处理
 * 最后要在Stream商添加终端环节, 永遇得到最终的处理结果
 * 步骤: 集合转为流 ->> 中间操作 ->> 终端操作
 */
public class StreamApiDemo {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        Random rand = new Random();
        for(int i=0; i<10; i++){
            list.add(rand.nextInt(10));
        }
        System.out.println(list);
        /*
            常见的中间环节:
            1.map:
               map方法接受一个lambda表达式, 将集合中每个元素都经历一次该表达式,并将表达式处理的结果替换该元素
            2.filter:
                filter方法尅过滤流中的每个元素, 仅保留符合lambda表达式要求的元素
            3.distinct:
                distinct方法可以过滤重复的元素
            4.sorted:
                sorted方法可以对流中的元素进行排序
         */
        //将集合每个元素扩大三倍
        List<Integer> list2 = list.stream()// 将集合变为流
                                .map(e->e*3)// 添加map中能建环节, 对每个元素进行扩大三倍
                                .collect(Collectors.toList());// 添加终端环节, 将处理结果收集到集合中, 将流变为集合
        System.out.println(list2);

        //仅保留集合中所有的偶数
        List<Integer> list3 = list.stream()//将集合变为流
                                .filter(e->e%2==0)// 添加filter中间环节, 仅保留集合中所有的偶数
                                .collect(Collectors.toList());// 添加终端环节, 将处理结果收集到集合中, 将流变为集合
        System.out.println(list3);

        //去除集合中的重复元素
        List<Integer> list4 = list.stream()//将集合变为流
                                .distinct()//添加distinct中间环节, 去掉重复元素
                                .collect(Collectors.toList());//添加终端环节, 将处理结果收集到集合中, 将流变为集合
        System.out.println(list4);

        //将集合中的元素按照降序排序
        List<Integer> list5 = list.stream()//将集合变为流
                                .sorted((e1,e2)->e2-e1)//添加sorted中间环节, 将集合中的元素按照降序排序
                                .collect(Collectors.toList());//添加终端环节, 将处理结果收集到集合中, 将流变为集合
        System.out.println(list5);

       // 将集合中的元素扩大3倍保留偶数去除掉重复元素并按照降序排序
        List<Integer> list6 = list.stream() //将集合变为流
                                .map(e->e*3) // 添加map中间环节, 将集合中的元素扩大3倍
                                .filter(e->e%2==0) // 添加filter中间环节, 仅保留集合中所有的偶数
                                .distinct() //添加distinct中间环节, 去掉重复元素
                                .sorted((e1,e2)->e2-e1// 添加sorted中间环节, 将集合中的元素按照降序排序
                                )
                                .collect(Collectors.toList());// 添加终端环节, 将处理结果收集到集合中, 将流变为集合

    }
}
